#pragma once
/**
 * 此模块为将数据渲染成给用户提供展示的网页内容
 * 提供三个接口，
 * 1.对所有题目形成一个表格形式的题目列表渲染
 * 2.对指定题目提供题目简介，题目说明，代码编辑区域的渲染
 * 3.对错误访问页面的渲染
 */
#include "../Comm/comm.hpp"
#include "oj_model.hpp"
#include<ctemplate/template.h>
namespace ns_view
{
    using namespace ns_model;
    const std::string template_path = "./template_html/";
    //此类的功能为将数据内容对网页进行渲染
    class View
    {
        public:
        View(){}
        ~View(){}
        //该函数提供将所有的题目数据渲染成网页
        void AllExpandHtml(const std::vector<struct Question>& questions,std::string* html)
        {
            //表格形式：题目编号 题目名称 题目难度

            //1.形成路径-->需要渲染的网页路径
            std::string src_html = template_path+"all_questions.html";
            //2.形成字典
            ctemplate::TemplateDictionary root("all_questions");
            for(const auto& q:questions)
            {
                //先行成子字典，然后再插入到root字典
                ctemplate::TemplateDictionary * sub = root.AddSectionDictionary("question_list");
                sub->SetValue("number",q._number);
                sub->SetValue("title",q._title);
                sub->SetValue("star",q._star);
            }
            //3.获取被渲染的html
            ctemplate::Template* tmp = ctemplate::Template::GetTemplate(src_html,ctemplate::DO_NOT_STRIP);

            //4.进行渲染
            tmp->Expand(html,&root);
        }
        //该函数提供将指定的一个题目数据渲染成网页并返回
        void OneExpandHtml(const struct Question& q, std::string* html)
        {
            //1.形成路径-->需要渲染的网页路径
            std::string src_html = template_path+"one_question.html";
            //2.形成字典
            ctemplate::TemplateDictionary root("one_question");
            root.SetValue("number",q._number);
            root.SetValue("title",q._title);
            root.SetValue("star",q._star);
            root.SetValue("desc",q._desc);
            root.SetValue("pre_code",q._header);
             //3.获取被渲染的html
            ctemplate::Template* tmp = ctemplate::Template::GetTemplate(src_html,ctemplate::DO_NOT_STRIP);

            //4.进行渲染
            tmp->Expand(html,&root);

        }
        //该函数提供将错误网页渲染并返回
        void ErrExpandHtml(std::string* html)
        {
            std::string src_html = template_path+"err_questions.html"; 
            ctemplate::TemplateDictionary root("err_questions");
            std::string value = *html;
            root.SetValue("key",value);//类似于插入键值对
            html->clear();
            ctemplate::Template* tpl = ctemplate::Template::GetTemplate(src_html,ctemplate::DO_NOT_STRIP);
            tpl->Expand(html,&root);
        }
    };
}